/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ComExWeb.ui.beans;

import ComExWeb.dominio.Menu;
import ComExWeb.dominio.security.Recurso;
import ComExWeb.exception.ServiceException;
import ComExWeb.service.MenuService;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author 002824992500
 */
@ManagedBean
@ViewScoped
public class EditMenuJsfBean extends BaseCRUDJSFBean {

    private static final Logger log = LoggerFactory.getLogger(EditMenuJsfBean.class);
    private TreeNode raizMenu = new DefaultTreeNode("Root", null);
    private TreeNode menuItemSelecionado = null;
    private List<Recurso> listPaginas = new ArrayList<Recurso>();
    private TreeNode itemMenuTemp = null;
    private String componenteComFoco = "menu";

    public String getComponenteComFoco() {
        return componenteComFoco;
    }

    public void setComponenteComFoco(String componenteComFoco) {
        this.componenteComFoco = componenteComFoco;
    }

    public List<Recurso> getListPaginas() {
        return listPaginas;
    }

    public void setListPaginas(List<Recurso> listPaginas) {
        this.listPaginas = listPaginas;
    }

    public TreeNode getMenuItemSelecionado() {
        return menuItemSelecionado;
    }

    public void setMenuItemSelecionado(TreeNode menuItemSelecionado) {
        this.menuItemSelecionado = menuItemSelecionado;
    }

    public TreeNode getRaizMenu() {
        return raizMenu;
    }

    public void setRaizMenu(TreeNode raizMenu) {
        this.raizMenu = raizMenu;
    }
    private Menu menu;

    public Menu getMenu() {
        return menu;
    }

    public void setMenu(Menu menu) {
        this.menu = menu;
    }
    @EJB
    private MenuService menuService;

    /** Creates a new instance of ColaboradorJSFBean */
    public EditMenuJsfBean() {
    }

    @Override
    public void setup() {

        try {
            raizMenu = new DefaultTreeNode("Root", null);
            //setPaginaForm("form_xxx");
            //setPaginaListagem("list_xxx");
            setCrudClass(Menu.class);
            listPaginas = menuService.getTodasPaginas();
            menu = new Menu();

            buildMenu(raizMenu, menuService.getItensDeMenuDaRaiz(), null);

        } catch (Exception e) {
            String err = "Erro na inicialização: " + e.getMessage();
            error(err);
            log.error(err, e);
        }
    }

    private void buildMenu(TreeNode root, List<Menu> menusFilhos, TreeNode pai) {
        Collections.sort(menusFilhos);
        for (Menu m : menusFilhos) {
            TreeNode noFilho = new DefaultTreeNode(m, null);
            if (pai == null) {
                root.addChild(noFilho);
            } else {
                pai.addChild(noFilho);
            }
            buildMenu(root, m.getItensFilhos(), noFilho);
        }
    }

    public void onItemMenuSelect(NodeSelectEvent event) {
        this.menu = (Menu) event.getTreeNode().getData();
    }

    public void salvaItemMenu() {
        try {
//            if (this.menu == null) {
//                error("Para criar um novo item de menu, clique no botão \"Novo item de Menu\"");
//                return;
//            }

            if (this.menuItemSelecionado == null) {
                error("Selecione primeiro um item do menu na árvore à esquerda e, em seguida, clique em \"Novo item de Menu\"");
                return;
            }

            this.menu = getCrudService().save(this.menu);

            itemMenuTemp = null;

            info("Registro salvo com sucesso.");


        } catch (Exception e) {
            error("Erro ao tentar salvar: " + e.getMessage());
        }
    }

    public void novoItemFilho() {
        log.debug("##### Entrou em novoItemFilho()");
        if (this.menuItemSelecionado == null) {
            error("Nenhum item de menu foi selecionado.");
            return;
        }

        menu = new Menu();
        menu.setOrdem(menuItemSelecionado.getChildCount() + 1);
        itemMenuTemp = new DefaultTreeNode(menu, null);
        menuItemSelecionado.addChild(itemMenuTemp);
        menuItemSelecionado.setExpanded(true);

        Menu pai = (Menu) menuItemSelecionado.getData();
        pai.addMenuFilho(menu);
        componenteComFoco = "recurso";

    }

    public void novoItemIrmao() {
        log.debug("##### Entrou em novoItemIrmao()");
        if (this.menuItemSelecionado == null) {
            error("Nenhum item de menu foi selecionado.");
            return;
        }

        menu = new Menu();
        menu.setOrdem(menuItemSelecionado.getParent().getChildCount() + 1);
        itemMenuTemp = new DefaultTreeNode(menu, null);
        menuItemSelecionado.getParent().addChild(itemMenuTemp);
        menuItemSelecionado.getParent().setExpanded(true);

        Menu pai = (Menu) menuItemSelecionado.getParent().getData();
        pai.addMenuFilho(menu);
        componenteComFoco = "recurso";

    }

    public void cancelar() {
        if (itemMenuTemp == null) {
            return;
        }
        menu = new Menu();
        itemMenuTemp.getParent().getChildren().remove(itemMenuTemp);
        itemMenuTemp = null;

    }

    /**
     * TODO implementar o método excluir
     */
    public void excluiItemMenu() {
        if (this.menuItemSelecionado == null) {
            error("Nenhum item de menu foi selecionado.");
            return;
        }

        try {
            menuService.excluirMenu((Menu) menuItemSelecionado.getData());
            menuItemSelecionado.getParent().getChildren().remove(menuItemSelecionado);
        } catch (ServiceException e) {
            error(e.getMessage());
        } catch (Exception e) {
            String msg = "Ocorreu um erro inesperado ao tentar excluir: " + e.getMessage();
            error(msg);
            log.error(msg, e);
        }

    }
}
